//
// Created by xy on 2024/10/19.
//

#ifndef WEBDESK__HEAD_H_
#define WEBDESK__HEAD_H_

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <time.h>
#include <sys/wait.h>
#include <dirent.h>
#include <syslog.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <signal.h>
#include <sys/time.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>

#include"queue.h"
/*************************************************************************/
/*                          服务器                                       */
/*************************************************************************/
enum command{
     RM,LS,MKDIR,PUTS,GETS,PWD,CD,LOGIN,REGIST,ERR
};


typedef struct status{

    int thread_num;
    
    pthread_t* thread_ids;

    queue_t q;
    
    pthread_mutex_t lock;
    pthread_cond_t cond;



}status_t;

//初始化线程信息结构体
int init_status(status_t* status, int thread_num);

//初始化线程池
int init_thread_pool(status_t* status);

//初始化tcp连接
int init_socket(int* socket_fd, char* ip, char* port);

//将文件描述符加入epoll监听集合
int add_epoll(int epoll_fd, int fd);

//子线程的入库函数
void*  thread_main(void* argv);

//子线程与客户端交互的函数
int to_work(int net_fd);

//登陆验证函数
bool validate_login(int net_fd);

//注册
bool regsiter(int net_fd);


//mkdir
int mkdirServe(int net_fd);

//cd
int cdServe(int net_fd);


#define TRANINSIZE 4096
//小火车协议
typedef struct server_train_s{
    int len;
    char trainBuf[TRANINSIZE];
}server_train_t;

// 切割protocol，返回用户名、当前路径、命令参数(agv[0],agv[1],agv[2])
int getToken(char *protocol,char **agv);
// mkdir命令（服务端）
int mkdirServe(const int NetFd);
// cd命令（服务端）
int cdServe(const int NetFd);
// ls命令(服务器)
int lsServe(const int NetFd);
// rm命令(服务器)
int rmServe(const int NetFd);

//传文件给客户端
int put_clientfile(int netfd);
//接收客户端传来的文件
int get_clientfile(int netfd, struct client_info* info);



/*************************************************************************/
/*                          服务器                                       */
/*************************************************************************/

#endif //WEBDESK__HEAD_H_
